Spring Boot এবং OAuth2 Integration

Java Technologies - স্প্রিং বুট ক্লায়েন্ট (Spring Boot Client)
72
72

স্প্রিং বুট ক্লায়েন্টে OAuth2 ইন্টিগ্রেশন করা হয় থার্ড-পার্টি API-র সাথে সুরক্ষিত এবং অনুমোদিত (authorized) যোগাযোগের জন্য। নিচে Spring Security OAuth2 ব্যবহার করে ক্লায়েন্ট ইন্টিগ্রেশনের ধাপ এবং উদাহরণ দেখানো হলো:


১. প্রজেক্ট তৈরি করুন

Spring Initializr ব্যবহার করে একটি নতুন স্প্রিং বুট প্রজেক্ট তৈরি করুন। নিচের ডিপেনডেন্সি নির্বাচন করুন:

  • Spring Web
  • Spring Security
  • Spring Boot Starter OAuth2 Client

২. pom.xml ডিপেনডেন্সি যুক্ত করুন

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-security</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-oauth2-client</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
</dependencies>

৩. application.properties ফাইল কনফিগারেশন

নিচে উদাহরণ হিসেবে GitHub OAuth2 প্রদানকারী ব্যবহার করা হলো:

spring.security.oauth2.client.registration.github.client-id=your-github-client-id
spring.security.oauth2.client.registration.github.client-secret=your-github-client-secret
spring.security.oauth2.client.registration.github.scope=read:user
spring.security.oauth2.client.registration.github.redirect-uri={baseUrl}/login/oauth2/code/github
spring.security.oauth2.client.provider.github.authorization-uri=https://github.com/login/oauth/authorize
spring.security.oauth2.client.provider.github.token-uri=https://github.com/login/oauth/access_token
spring.security.oauth2.client.provider.github.user-info-uri=https://api.github.com/user
spring.security.oauth2.client.provider.github.user-name-attribute=id

৪. Spring Security Configuration

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.web.SecurityFilterChain;

@Configuration
public class SecurityConfig {

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http
            .authorizeHttpRequests(authorize -> authorize
                .requestMatchers("/").permitAll() // পাবলিক পেজ
                .anyRequest().authenticated() // বাকি সব পেজে অথেন্টিকেশন লাগবে
            )
            .oauth2Login(); // OAuth2 Login সাপোর্ট
        return http.build();
    }
}

৫. WebClient Bean কনফিগারেশন

OAuth2AuthorizedClientManager ব্যবহার করে WebClient তৈরি করুন:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.oauth2.client.OAuth2AuthorizedClientManager;
import org.springframework.security.oauth2.client.registration.ClientRegistrationRepository;
import org.springframework.security.oauth2.client.web.OAuth2AuthorizedClientRepository;
import org.springframework.web.reactive.function.client.WebClient;

@Configuration
public class WebClientConfig {

    @Bean
    public WebClient webClient(OAuth2AuthorizedClientManager authorizedClientManager) {
        return WebClient.builder()
                .filter(new ServletOAuth2AuthorizedClientExchangeFilterFunction(authorizedClientManager))
                .build();
    }

    @Bean
    public OAuth2AuthorizedClientManager authorizedClientManager(
            ClientRegistrationRepository clientRegistrationRepository,
            OAuth2AuthorizedClientRepository authorizedClientRepository) {

        ServletOAuth2AuthorizedClientExchangeFilterFunction oauth2FilterFunction =
                new ServletOAuth2AuthorizedClientExchangeFilterFunction(
                        clientRegistrationRepository, authorizedClientRepository);

        return oauth2FilterFunction.getOAuth2AuthorizedClientManager();
    }
}

৬. API ক্লায়েন্ট তৈরি করুন

import org.springframework.stereotype.Service;
import org.springframework.web.reactive.function.client.WebClient;
import reactor.core.publisher.Mono;

@Service
public class GitHubClient {

    private final WebClient webClient;

    public GitHubClient(WebClient webClient) {
        this.webClient = webClient;
    }

    public Mono<String> getUserProfile() {
        return webClient
                .get()
                .uri("https://api.github.com/user")
                .retrieve()
                .bodyToMono(String.class);
    }
}

৭. Controller ক্লাস তৈরি করুন

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Mono;

@RestController
public class GitHubController {

    private final GitHubClient gitHubClient;

    public GitHubController(GitHubClient gitHubClient) {
        this.gitHubClient = gitHubClient;
    }

    @GetMapping("/github/profile")
    public Mono<String> getGitHubProfile() {
        return gitHubClient.getUserProfile();
    }
}

৮. এন্ডপয়েন্ট টেস্ট করুন

OAuth2 Login Page:

  • ব্রাউজারে http://localhost:8080/github/profile এ যান।
  • এটি আপনাকে GitHub OAuth2 অথোরাইজেশন পেজে রিডাইরেক্ট করবে।
  • লগইন করার পর আপনার GitHub প্রোফাইল ডেটা রিটার্ন করবে।

৯. রেসপন্স উদাহরণ

GET /github/profile রেসপন্স:

{
    "login": "your-username",
    "id": 123456,
    "node_id": "ABCDEF12345",
    "avatar_url": "https://avatars.githubusercontent.com/u/123456?v=4",
    "name": "Your Name",
    "email": "your-email@example.com",
    ...
}

OAuth2 Integration এর সুবিধা:

  1. Secure Authentication: OAuth2 ব্যবহার করে ক্লায়েন্ট এবং সার্ভার উভয়ের মধ্যে সুরক্ষিত যোগাযোগ নিশ্চিত হয়।
  2. Third-Party API Integration: GitHub, Google, Facebook ইত্যাদি সেবাগুলির API সহজেই ইন্টিগ্রেট করা যায়।
  3. Spring Security Support: Spring Security স্বয়ংক্রিয়ভাবে OAuth2 Login এবং Token Management পরিচালনা করে।
  4. Reactive Programming: WebClient এর মাধ্যমে asynchronous API কল করা সম্ভব।

এই পদ্ধতিটি GitHub-এর পাশাপাশি Google, Facebook, এবং অন্য OAuth2 প্রদানকারীদের সাথেও ব্যবহার করা যায়। কেবল application.properties-এ প্রাসঙ্গিক কনফিগারেশন পরিবর্তন করুন।

Content added By

OAuth2 কি এবং কেন প্রয়োজন?

54
54

OAuth2: একটি পরিচিতি

OAuth2 (Open Authorization 2.0) হলো একটি প্রটোকল যা ব্যবহারকারীর ক্রেডেনশিয়াল প্রকাশ না করেই তৃতীয় পক্ষের অ্যাপ্লিকেশনগুলোকে কোনো রিসোর্স (যেমন: API, ডেটা, বা সার্ভিস) অ্যাক্সেস করার অনুমতি দেয়। এটি স্পষ্টতই অথেনটিকেশন এবং অথরাইজেশনের জন্য ব্যবহৃত হয় এবং মূলত টোকেন-ভিত্তিক অথরাইজেশনের মাধ্যমে কাজ করে।


OAuth2 কেন প্রয়োজন?

OAuth2 এর প্রধান প্রয়োজন হলো নিরাপদ অথরাইজেশন। কিছু সাধারণ প্রয়োজনীয়তাগুলি হলো:

  1. ব্যক্তিগত তথ্যের সুরক্ষা: ব্যবহারকারীর পাসওয়ার্ড বা সংবেদনশীল তথ্য শেয়ার না করেও তৃতীয় পক্ষের অ্যাপ্লিকেশন ব্যবহার করতে পারে।
  2. সেশন-মুক্ত অথরাইজেশন: টোকেনের মাধ্যমে কাজ করে বলে ব্যবহারকারীকে বারবার লগইন করতে হয় না।
  3. API অথরাইজেশন: ক্লায়েন্ট অ্যাপ্লিকেশনগুলো নির্দিষ্ট API রিসোর্সগুলোতে সীমিত অ্যাক্সেস পায়।
  4. বহু ডিভাইস সাপোর্ট: ওয়েব, মোবাইল, এবং ডেস্কটপ অ্যাপ্লিকেশনের জন্য একই অথরাইজেশন প্রক্রিয়া।
  5. স্ট্যান্ডার্ডাইজড প্রটোকল: OAuth2 একটি গ্লোবাল স্ট্যান্ডার্ড, তাই এটি বিভিন্ন প্ল্যাটফর্মে সমর্থনযোগ্য।

OAuth2 এর মূল ধারণা

OAuth2 মূলত চারটি গুরুত্বপূর্ণ রোল নির্ধারণ করে:

  1. Resource Owner: রিসোর্সের মালিক (ব্যবহারকারী বা সিস্টেম)।
  2. Resource Server: রিসোর্স হোস্ট করে (যেমন: API)।
  3. Client Application: তৃতীয় পক্ষের অ্যাপ্লিকেশন যা রিসোর্স অ্যাক্সেস করতে চায়।
  4. Authorization Server: টোকেন ইস্যু করে এবং ক্লায়েন্টের অথেনটিকেশন ভেরিফাই করে।

OAuth2 কাজ করার পদ্ধতি

OAuth2 কাজ করে একটি Access Token এর মাধ্যমে। নিচে প্রক্রিয়াটি ধাপে ধাপে ব্যাখ্যা করা হলো:

  1. Authorization Request: ক্লায়েন্ট অ্যাপ্লিকেশন ব্যবহারকারীর অনুমতি চায়।
  2. Authorization Grant: ব্যবহারকারী অনুমতি দেয় এবং একটি Authorization Code সরবরাহ করা হয়।
  3. Access Token Issue: ক্লায়েন্ট অ্যাপ্লিকেশন এই কোডটি ব্যবহার করে Access Token সংগ্রহ করে।
  4. API Access: ক্লায়েন্ট অ্যাপ্লিকেশন এই টোকেনটি ব্যবহার করে নির্দিষ্ট API বা রিসোর্সে অ্যাক্সেস পায়।

OAuth2 এর Grant Types

OAuth2 বিভিন্ন প্রয়োজনীয়তার উপর ভিত্তি করে চারটি গ্রান্ট টাইপ সরবরাহ করে:

  1. Authorization Code Grant: ওয়েব এবং মোবাইল অ্যাপ্লিকেশনের জন্য সবচেয়ে নিরাপদ এবং সাধারণত ব্যবহৃত হয়।
  2. Implicit Grant: ক্লায়েন্ট-সাইড অ্যাপ্লিকেশনের জন্য দ্রুত অথরাইজেশনের পদ্ধতি (কিন্তু কম নিরাপদ)।
  3. Resource Owner Password Credentials Grant: ব্যবহারকারী সরাসরি পাসওয়ার্ড প্রদান করে (কম ব্যবহৃত কারণ এটি নিরাপত্তার জন্য ঝুঁকিপূর্ণ)।
  4. Client Credentials Grant: সার্ভার-টু-সার্ভার কমিউনিকেশনের জন্য ব্যবহৃত হয়।

স্প্রিং বুট ক্লায়েন্টে OAuth2 ব্যবহার

স্প্রিং বুট ক্লায়েন্টে OAuth2 ব্যবহার করা সহজ এবং এটি Spring Security এর মাধ্যমে সম্পন্ন হয়। নিচে ধাপে ধাপে OAuth2 ইন্টিগ্রেশনের পদ্ধতি দেখানো হলো:


OAuth2 কনফিগারেশন

১. ডিপেন্ডেন্সি যুক্ত করা:

pom.xml এ নিচের ডিপেন্ডেন্সি যুক্ত করুন:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-oauth2-client</artifactId>
</dependency>

২. application.yml ফাইল কনফিগারেশন:

application.yml ফাইলে OAuth2 ক্লায়েন্টের কনফিগারেশন যুক্ত করুন।

spring:
  security:
    oauth2:
      client:
        registration:
          google:
            client-id: YOUR_CLIENT_ID
            client-secret: YOUR_CLIENT_SECRET
            scope:
              - openid
              - profile
              - email
            redirect-uri: "{baseUrl}/login/oauth2/code/google"
            authorization-grant-type: authorization_code
        provider:
          google:
            authorization-uri: https://accounts.google.com/o/oauth2/auth
            token-uri: https://oauth2.googleapis.com/token
            user-info-uri: https://openidconnect.googleapis.com/v1/userinfo

৩. Security Configuration তৈরি:

OAuth2 এর জন্য একটি কাস্টম সিকিউরিটি কনফিগারেশন ক্লাস তৈরি করুন।

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.oauth2.client.web.OAuth2LoginAuthenticationFilter;
import org.springframework.security.web.SecurityFilterChain;

@Configuration
public class SecurityConfig {

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http
            .authorizeHttpRequests()
            .anyRequest().authenticated()
            .and()
            .oauth2Login(); // OAuth2 Login Enable
        return http.build();
    }
}

৪. REST API কল করার জন্য Access Token ব্যবহার:

RestTemplate বা WebClient দিয়ে অ্যাক্সেস টোকেন ব্যবহার করে API অ্যাক্সেস করুন।

import org.springframework.security.oauth2.client.OAuth2AuthorizedClient;
import org.springframework.security.oauth2.client.annotation.RegisteredOAuth2AuthorizedClient;
import org.springframework.security.oauth2.core.OAuth2AccessToken;
import org.springframework.stereotype.Service;
import org.springframework.web.reactive.function.client.WebClient;

@Service
public class ApiService {

    private final WebClient webClient;

    public ApiService(WebClient.Builder webClientBuilder) {
        this.webClient = webClientBuilder.build();
    }

    public String getProtectedResource(
            @RegisteredOAuth2AuthorizedClient("google") OAuth2AuthorizedClient authorizedClient) {

        OAuth2AccessToken accessToken = authorizedClient.getAccessToken();

        return webClient.get()
                .uri("https://api.example.com/protected-resource")
                .headers(headers -> headers.setBearerAuth(accessToken.getTokenValue()))
                .retrieve()
                .bodyToMono(String.class)
                .block();
    }
}

OAuth2 এর সুবিধা

  1. নিরাপত্তা: পাসওয়ার্ড বা সংবেদনশীল তথ্য প্রকাশ ছাড়াই রিসোর্স অ্যাক্সেস করা যায়।
  2. স্ট্যান্ডার্ডাইজড অথরাইজেশন: OAuth2 বিভিন্ন সিস্টেমের মধ্যে একটি সাধারণ অথরাইজেশন মডেল সরবরাহ করে।
  3. বহুমুখী ব্যবহার: ওয়েব, মোবাইল এবং সার্ভার-টু-সার্ভার অথরাইজেশনে কার্যকর।
  4. লিমিটেড অ্যাক্সেস: ক্লায়েন্ট অ্যাপ্লিকেশন শুধু নির্দিষ্ট ডেটা বা ফিচার অ্যাক্সেস করতে পারে।
  5. Token Expiration: টোকেনের মেয়াদ শেষ হওয়ার সুবিধা রয়েছে যা নিরাপত্তা বৃদ্ধি করে।

উপসংহার

OAuth2 ব্যবহারকারীর অথেনটিকেশন এবং অথরাইজেশন প্রক্রিয়াকে সহজ, নিরাপদ এবং স্ট্যান্ডার্ড করে। স্প্রিং বুট ক্লায়েন্টে OAuth2 ইন্টিগ্রেশন সহজ এবং কার্যকর। এটি ব্যবহার করে তৃতীয় পক্ষের API এবং সিস্টেমের সাথে নিরাপদ অথরাইজেশন নিশ্চিত করা যায়।

Content added By

OAuth2 এর মাধ্যমে Access Token সংগ্রহ করা

57
57

Spring Boot ক্লায়েন্টে OAuth2 এর মাধ্যমে Access Token সংগ্রহ করা একটি সাধারণ কাজ, বিশেষত যখন API সুরক্ষিত থাকে এবং অ্যাক্সেসের জন্য টোকেন প্রয়োজন হয়। নিচে একটি উদাহরণসহ ধাপে ধাপে প্রক্রিয়াটি ব্যাখ্যা করা হলো।


OAuth2 Access Token সংগ্রহের ধাপসমূহ

  1. ডিপেনডেন্সি যোগ করুন Spring Security এবং OAuth2 ক্লায়েন্ট লাইব্রেরি যোগ করুন।

    Maven Dependency:

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-oauth2-client</artifactId>
    </dependency>
    

  1. Application Properties বা YAML ফাইল কনফিগার করুন OAuth2 প্রোভাইডার সম্পর্কিত তথ্য সেট করুন। যেমন, ক্লায়েন্ট আইডি, সিক্রেট, এবং টোকেন ইউআরএল।

    application.properties:

    spring.security.oauth2.client.registration.my-client.client-id=your-client-id
    spring.security.oauth2.client.registration.my-client.client-secret=your-client-secret
    spring.security.oauth2.client.registration.my-client.authorization-grant-type=client_credentials
    spring.security.oauth2.client.registration.my-client.scope=read,write
    spring.security.oauth2.client.provider.my-client.token-uri=https://auth-server.com/oauth/token
    

    ব্যাখ্যা:

    • client-id: OAuth প্রোভাইডার থেকে প্রাপ্ত ক্লায়েন্ট আইডি।
    • client-secret: OAuth প্রোভাইডার থেকে প্রাপ্ত সিক্রেট।
    • authorization-grant-type: সাধারণত client_credentials
    • token-uri: টোকেন সংগ্রহ করার জন্য ইউআরএল।

  1. RestTemplate বা WebClient ব্যবহার করে Access Token সংগ্রহ করুন

    RestTemplate ব্যবহার করে:

    import org.springframework.http.ResponseEntity;
    import org.springframework.stereotype.Service;
    import org.springframework.web.client.RestTemplate;
    import org.springframework.http.HttpHeaders;
    import org.springframework.http.HttpEntity;
    import org.springframework.http.HttpMethod;
    
    import java.util.Base64;
    import java.util.HashMap;
    import java.util.Map;
    
    @Service
    public class OAuth2TokenService {
    
        private final RestTemplate restTemplate;
    
        public OAuth2TokenService(RestTemplate restTemplate) {
            this.restTemplate = restTemplate;
        }
    
        public String getAccessToken() {
            String url = "https://auth-server.com/oauth/token";
    
            // Basic Authentication Header
            String clientId = "your-client-id";
            String clientSecret = "your-client-secret";
            String credentials = clientId + ":" + clientSecret;
            String encodedCredentials = Base64.getEncoder().encodeToString(credentials.getBytes());
    
            HttpHeaders headers = new HttpHeaders();
            headers.add("Authorization", "Basic " + encodedCredentials);
            headers.add("Content-Type", "application/x-www-form-urlencoded");
    
            Map<String, String> body = new HashMap<>();
            body.put("grant_type", "client_credentials");
    
            HttpEntity<Map<String, String>> request = new HttpEntity<>(body, headers);
    
            ResponseEntity<Map> response = restTemplate.exchange(url, HttpMethod.POST, request, Map.class);
            return response.getBody().get("access_token").toString();
        }
    }
    

  1. WebClient ব্যবহার করে:

    import org.springframework.web.reactive.function.client.WebClient;
    import org.springframework.stereotype.Service;
    import reactor.core.publisher.Mono;
    
    @Service
    public class OAuth2TokenService {
    
        private final WebClient webClient;
    
        public OAuth2TokenService(WebClient.Builder webClientBuilder) {
            this.webClient = webClientBuilder.baseUrl("https://auth-server.com").build();
        }
    
        public Mono<String> getAccessToken() {
            return webClient.post()
                    .uri("/oauth/token")
                    .headers(headers -> {
                        headers.setBasicAuth("your-client-id", "your-client-secret");
                        headers.setContentType(org.springframework.http.MediaType.APPLICATION_FORM_URLENCODED);
                    })
                    .bodyValue("grant_type=client_credentials")
                    .retrieve()
                    .bodyToMono(Map.class)
                    .map(response -> response.get("access_token").toString());
        }
    }
    

  1. Spring Security OAuth2 Client (Auto-Configuration ব্যবহার): Spring Security-এর OAuth2 Client ব্যবহার করলে Spring নিজেই টোকেন সংগ্রহ করতে পারে।

    Service Class উদাহরণ:

    import org.springframework.security.oauth2.client.OAuth2AuthorizedClient;
    import org.springframework.security.oauth2.client.OAuth2AuthorizedClientManager;
    import org.springframework.security.oauth2.client.registration.ClientRegistrationRepository;
    import org.springframework.security.oauth2.client.web.reactive.function.client.ServerOAuth2AuthorizedClientExchangeFilterFunction;
    import org.springframework.stereotype.Service;
    import org.springframework.web.reactive.function.client.WebClient;
    
    @Service
    public class ApiService {
    
        private final WebClient webClient;
    
        public ApiService(OAuth2AuthorizedClientManager authorizedClientManager) {
            this.webClient = WebClient.builder()
                    .filter(new ServerOAuth2AuthorizedClientExchangeFilterFunction(authorizedClientManager))
                    .build();
        }
    
        public Mono<String> fetchData() {
            return webClient.get()
                    .uri("https://api.example.com/protected-resource")
                    .retrieve()
                    .bodyToMono(String.class);
        }
    }
    

উদাহরণ Access Token ব্যবহার করে API কল

Access Token সংগ্রহের পর এটি HTTP Header-এ পাঠিয়ে API কল করা হয়।

public String fetchData(String accessToken) {
    HttpHeaders headers = new HttpHeaders();
    headers.add("Authorization", "Bearer " + accessToken);

    HttpEntity<String> entity = new HttpEntity<>(headers);

    String apiUrl = "https://api.example.com/protected-resource";
    ResponseEntity<String> response = restTemplate.exchange(apiUrl, HttpMethod.GET, entity, String.class);

    return response.getBody();
}

উপসংহার

Spring Boot-এ OAuth2 Access Token সংগ্রহের জন্য:

  1. Spring Security OAuth2 Client ব্যবহার করুন যদি স্বয়ংক্রিয়ভাবে টোকেন সংগ্রহ করতে চান।
  2. ম্যানুয়ালি করতে হলে RestTemplate বা WebClient ব্যবহার করুন।

এটি নিরাপদ অ্যাপ্লিকেশন তৈরির একটি গুরুত্বপূর্ণ অংশ।

Content added By

Spring Boot এ OAuth2 এর ইন্টিগ্রেশন

92
92

OAuth2 হল একটি ইন্ডাস্ট্রি-স্ট্যান্ডার্ড প্রোটোকল যা সিকিউরড অথরাইজেশন মেকানিজম প্রদান করে। Spring Boot-এ OAuth2 ইন্টিগ্রেশন সহজে করা যায় Spring Security ফ্রেমওয়ার্ক ব্যবহার করে। এটি ব্যবহার করে আপনার অ্যাপ্লিকেশন থার্ড-পার্টি প্রোভাইডার (যেমন Google, GitHub, Facebook) থেকে অথেন্টিকেশন এবং অথরাইজেশন পেতে পারে।


OAuth2 ইন্টিগ্রেশন পদ্ধতি

Spring Boot অ্যাপ্লিকেশনে OAuth2 ইন্টিগ্রেশনের ধাপগুলো নিম্নরূপ:


১. প্রকল্প তৈরি

Spring Initializer (start.spring.io) ব্যবহার করে প্রজেক্ট তৈরি করুন। নিচের ডিপেন্ডেন্সিগুলি যোগ করুন:

  • Spring Boot Starter Web
  • Spring Boot Starter OAuth2 Client
  • Spring Boot Starter Security

Maven Dependency (pom.xml):

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-security</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-oauth2-client</artifactId>
    </dependency>
</dependencies>

২. Application Configuration

application.properties বা application.yml ফাইলে কনফিগারেশন:

spring.security.oauth2.client.registration.google.client-id=YOUR_GOOGLE_CLIENT_ID
spring.security.oauth2.client.registration.google.client-secret=YOUR_GOOGLE_CLIENT_SECRET
spring.security.oauth2.client.registration.google.redirect-uri={baseUrl}/login/oauth2/code/google
spring.security.oauth2.client.registration.google.scope=openid,profile,email
spring.security.oauth2.client.registration.google.authorization-grant-type=authorization_code
spring.security.oauth2.client.registration.google.client-name=Google

spring.security.oauth2.client.provider.google.authorization-uri=https://accounts.google.com/o/oauth2/auth
spring.security.oauth2.client.provider.google.token-uri=https://oauth2.googleapis.com/token
spring.security.oauth2.client.provider.google.user-info-uri=https://www.googleapis.com/oauth2/v3/userinfo
spring.security.oauth2.client.provider.google.jwk-set-uri=https://www.googleapis.com/oauth2/v3/certs
spring.security.oauth2.client.provider.google.user-name-attribute=sub

OAuth2 Provider Configuration:

উদাহরণে Google ব্যবহার করা হয়েছে। আপনি GitHub, Facebook ইত্যাদিও কনফিগার করতে পারেন।


৩. Spring Security Configuration

Spring Security কনফিগারেশনে OAuth2 Login সেটআপ করতে হবে।

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.web.SecurityFilterChain;

@Configuration
public class SecurityConfig {

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                .antMatchers("/", "/login").permitAll() // Public URL
                .anyRequest().authenticated() // Secure All Other URLs
            .and()
            .oauth2Login() // Enable OAuth2 Login
                .defaultSuccessUrl("/welcome", true); // Redirect after successful login
        return http.build();
    }
}

৪. Controller তৈরি করুন

OAuth2 অথেন্টিকেশনের পরে ইউজার ডেটা রিসিভ করতে Principal ব্যবহার করা হয়।

import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.security.oauth2.core.user.OAuth2User;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class OAuth2Controller {

    @GetMapping("/")
    public String index() {
        return "index"; // একটি সাধারণ হোম পেজ
    }

    @GetMapping("/welcome")
    public String welcome(@AuthenticationPrincipal OAuth2User user, Model model) {
        model.addAttribute("name", user.getAttribute("name"));
        model.addAttribute("email", user.getAttribute("email"));
        return "welcome"; // ইউজারের তথ্য দেখানোর জন্য পেজ
    }
}

৫. Frontend (HTML Templates)

index.html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Home</title>
</head>
<body>
    <h1>Welcome to Spring Boot OAuth2</h1>
    <a href="/oauth2/authorization/google">Login with Google</a>
</body>
</html>

welcome.html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Welcome</title>
</head>
<body>
    <h1>Welcome, ${name}</h1>
    <p>Your email: ${email}</p>
    <a href="/logout">Logout</a>
</body>
</html>

৬. রান এবং টেস্টিং

  1. Spring Boot অ্যাপ্লিকেশন চালু করুন।
  2. ব্রাউজারে http://localhost:8080 এ যান।
  3. Google Login বাটনে ক্লিক করুন।
  4. লগইন সফল হলে, ওয়েলকাম পেজে ইউজারের নাম এবং ইমেইল দেখাবে।

OAuth2 এর গুরুত্বপূর্ণ উপাদান

  1. Client Registration: অ্যাপ্লিকেশন যে OAuth2 প্রোভাইডার ব্যবহার করবে তার তথ্য।
  2. Authorization Grant Type: authorization_code, implicit, password, বা client_credentials
  3. Redirect URI: লগইন সফল হলে ইউজারকে কোথায় রিডাইরেক্ট করা হবে।
  4. Scopes: কোন ধরনের ডেটা অ্যাক্সেসের জন্য অনুমতি প্রয়োজন।

উপসংহার

Spring Boot-এর মাধ্যমে OAuth2 ইন্টিগ্রেশন সহজ এবং কার্যকর। এটি আপনার অ্যাপ্লিকেশনকে সিকিউর অথেন্টিকেশন মডেলে উন্নীত করতে সহায়তা করে। যদি আপনার নির্দিষ্ট প্রয়োজন বা সমস্যার জন্য সাহায্য দরকার হয়, জানাবেন! 😊

Content added By

উদাহরণ সহ OAuth2 Integration

67
67

স্প্রিং বুট ক্লায়েন্টে OAuth2 ব্যবহার করে API-এর সাথে সুরক্ষিত যোগাযোগ স্থাপন করতে হলে নির্দিষ্ট কনফিগারেশন এবং টুল ব্যবহার করতে হয়। OAuth2 ইনটিগ্রেশনের জন্য স্প্রিং সিকিউরিটির spring-boot-starter-oauth2-client ডিপেনডেন্সি ব্যবহার করা হয়। এখানে উদাহরণসহ OAuth2 ইন্টিগ্রেশনের সম্পূর্ণ প্রক্রিয়া দেখানো হলো।


১. প্রজেক্ট সেটআপ

ডিপেনডেন্সি যোগ করুন

pom.xml-এ OAuth2 ক্লায়েন্টের জন্য নিচের ডিপেনডেন্সি যুক্ত করুন:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-oauth2-client</artifactId>
</dependency>

Gradle ব্যবহার করলে:

implementation 'org.springframework.boot:spring-boot-starter-oauth2-client'

২. প্রোপার্টিজ কনফিগারেশন

application.yml বা application.properties ফাইলে OAuth2 কনফিগারেশন যুক্ত করুন। এখানে আমরা Google-এর OAuth2 ব্যবহার করছি উদাহরণ হিসেবে:

application.yml

spring:
  security:
    oauth2:
      client:
        registration:
          google:
            client-id: YOUR_CLIENT_ID
            client-secret: YOUR_CLIENT_SECRET
            scope:
              - openid
              - profile
              - email
            redirect-uri: "{baseUrl}/login/oauth2/code/{registrationId}"
            authorization-grant-type: authorization_code
            client-authentication-method: basic
        provider:
          google:
            authorization-uri: https://accounts.google.com/o/oauth2/v2/auth
            token-uri: https://oauth2.googleapis.com/token
            user-info-uri: https://openidconnect.googleapis.com/v1/userinfo

application.properties

spring.security.oauth2.client.registration.google.client-id=YOUR_CLIENT_ID
spring.security.oauth2.client.registration.google.client-secret=YOUR_CLIENT_SECRET
spring.security.oauth2.client.registration.google.scope=openid,profile,email
spring.security.oauth2.client.registration.google.redirect-uri={baseUrl}/login/oauth2/code/{registrationId}
spring.security.oauth2.client.registration.google.authorization-grant-type=authorization_code
spring.security.oauth2.client.registration.google.client-authentication-method=basic
spring.security.oauth2.client.provider.google.authorization-uri=https://accounts.google.com/o/oauth2/v2/auth
spring.security.oauth2.client.provider.google.token-uri=https://oauth2.googleapis.com/token
spring.security.oauth2.client.provider.google.user-info-uri=https://openidconnect.googleapis.com/v1/userinfo

৩. RestTemplate বা WebClient-এ OAuth2 Token ব্যবহার করা

RestTemplate-এ OAuth2 Integration:

স্প্রিং সিকিউরিটির OAuth2AuthorizedClientService ব্যবহার করে টোকেন ফেচ করা হয় এবং এটি হেডারে যোগ করে API কল করা যায়।

উদাহরণ:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.oauth2.client.OAuth2AuthorizedClient;
import org.springframework.security.oauth2.client.OAuth2AuthorizedClientService;
import org.springframework.security.oauth2.client.annotation.RegisteredOAuth2AuthorizedClient;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;

@Service
public class OAuth2RestTemplateClient {

    @Autowired
    private OAuth2AuthorizedClientService authorizedClientService;

    public String getProtectedResource(@RegisteredOAuth2AuthorizedClient("google") OAuth2AuthorizedClient authorizedClient) {
        String accessToken = authorizedClient.getAccessToken().getTokenValue();

        RestTemplate restTemplate = new RestTemplate();
        String url = "https://api.example.com/protected-resource";

        HttpHeaders headers = new HttpHeaders();
        headers.setBearerAuth(accessToken);

        HttpEntity<String> entity = new HttpEntity<>(headers);

        return restTemplate.exchange(url, HttpMethod.GET, entity, String.class).getBody();
    }
}

WebClient-এ OAuth2 Integration:

WebClient-এ ServerOAuth2AuthorizedClientExchangeFilterFunction ব্যবহার করে সিম্পল পদ্ধতিতে OAuth2 টোকেন যোগ করা যায়।

উদাহরণ:

import org.springframework.security.oauth2.client.web.reactive.function.client.ServerOAuth2AuthorizedClientExchangeFilterFunction;
import org.springframework.stereotype.Service;
import org.springframework.web.reactive.function.client.WebClient;

@Service
public class OAuth2WebClient {

    private final WebClient webClient;

    public OAuth2WebClient(WebClient.Builder webClientBuilder,
                           ServerOAuth2AuthorizedClientExchangeFilterFunction oauth2Client) {
        this.webClient = webClientBuilder
                .apply(oauth2Client.oauth2Configuration())
                .baseUrl("https://api.example.com")
                .build();
    }

    public String getProtectedResource() {
        return webClient
                .get()
                .uri("/protected-resource")
                .retrieve()
                .bodyToMono(String.class)
                .block();
    }
}

৪. কন্ট্রোলার তৈরি করা

একটি কন্ট্রোলার তৈরি করুন যা OAuth2 সুরক্ষিত API কল করবে:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class OAuth2Controller {

    @Autowired
    private OAuth2RestTemplateClient restTemplateClient;

    @Autowired
    private OAuth2WebClient webClient;

    @GetMapping("/use-resttemplate")
    public String callUsingRestTemplate() {
        return restTemplateClient.getProtectedResource(null);
    }

    @GetMapping("/use-webclient")
    public String callUsingWebClient() {
        return webClient.getProtectedResource();
    }
}

৫. রিডিরেকশন এবং লগইন পেজ

OAuth2 ইনটিগ্রেশন করার পর /login এ যাওয়ার মাধ্যমে আপনি OAuth2 প্রদানকারী (যেমন: Google) এর লগইন পেজে রিডিরেক্ট হবেন।


৬. গুরুত্বপূর্ণ পয়েন্ট

  1. Access Token রিফ্রেশ: যদি টোকেন এক্সপায়ার হয়ে যায়, তাহলে স্বয়ংক্রিয়ভাবে টোকেন রিফ্রেশ করার জন্য স্প্রিং সিকিউরিটির বিল্ট-ইন ফিচার ব্যবহার করা হয়।
  2. Scope এবং Authorization Grant Type: আপনার প্রয়োজন অনুযায়ী স্কোপ এবং গ্রান্ট টাইপ নির্বাচন করুন।
  3. Custom Provider: Google ছাড়া অন্য OAuth2 প্রোভাইডারের জন্য প্রয়োজনীয় কনফিগারেশন পরিবর্তন করতে হবে।

এইভাবে আপনি স্প্রিং বুট ক্লায়েন্টে OAuth2 ইন্টিগ্রেশন করতে পারবেন এবং সুরক্ষিত API-এর সাথে যোগাযোগ করতে পারবেন।

Content added By
টপ রেটেড অ্যাপ

স্যাট অ্যাকাডেমী অ্যাপ

আমাদের অল-ইন-ওয়ান মোবাইল অ্যাপের মাধ্যমে সীমাহীন শেখার সুযোগ উপভোগ করুন।

ভিডিও
লাইভ ক্লাস
এক্সাম
ডাউনলোড করুন
Promotion